package com.glink.manage.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.glink.common.exception.GeneralSimpleException;
import com.glink.manage.domain.OrgBean;
import com.glink.manage.dto.org.OrgSaveRequestDTO;
import com.glink.manage.dto.org.OrgUpdateRequestDTO;
import com.glink.manage.vo.org.OrgBaseInfoVO;
import com.glink.manage.vo.org.OrgIdRequestDTO;
import com.glink.manage.vo.org.OrgInfoVO;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : qiushaoshan
 * @create 2024/6/18 14:16
 */
public interface OrgService extends IService<OrgBean> {
    /**
     * 保存组织
     * @param saveRequestDTO 保存的信息
     * @return 保存状态
     */
    boolean insertOrg(OrgSaveRequestDTO saveRequestDTO) throws GeneralSimpleException;

    /**
     * 修改组织
     * @param updateRequestDTO 保存的信息
     * @return 保存状态
     */
    boolean updateOrg(OrgUpdateRequestDTO updateRequestDTO) throws GeneralSimpleException;

    
    /**
     * 删除组织
     * @param orgId 组织ID
     * @return 结果
     */
    boolean delOrg(String orgId) throws GeneralSimpleException;

    /**
     * 获取组织菜单树
     *
     * @return 菜单树
     */
    List<OrgInfoVO> getOrgTree();

    /**
     * 获取所有参建单位ID
     * @return 参建单位ID
     */
    List<String> findAllParticipatingUnitId();

    /**
     * 获取所有部门ID
     * @return 部门ID
     */
    List<String> findAllDepartmentId() throws GeneralSimpleException;
        
    /**
     * 查询组织名称
     * @param orgId 组织ID
     * @return 组织名称
     */
    String findOrgNameByOrgId(String orgId);

    /**
     * 根据组织ID查询组织信息
     * @param dto 组织ID
     * @return 组织信息
     */
    OrgBaseInfoVO findById(OrgIdRequestDTO dto);

    /**
     * 根据组织ID查询组织及其下级机构ID
     * @param orgId 组织ID
     * @return 组织树ID
     */
    List<String> findOrgTreeIdByOrgId(String orgId) throws GeneralSimpleException;

    /**
     * 数据权限，根据用户单位ID查询权限内的所有单位ID(包括参建单位)
     * @return 单位ID
     */
    List<String> getDataPermissionOrgId() throws GeneralSimpleException;

    /**
     * 数据权限，根据用户单位ID查询权限内的所有单位ID(包括参建单位)
     * @return 单位ID
     */
    List<String> getDataPermissionParticipatingUnitId() throws GeneralSimpleException;
    
    List<String> getDataPermissionParticipatingUnitIdByOrgIdIn(List<String> orgIdList);

    /**
     * 从工程中获取所有关联的参建单位ID
     * @return 参建单位ID
     */
    List<String> getAllParticipatingUnitIdByWork() throws GeneralSimpleException;
    
    /**
     * 查询权限内的部门ID
     * @return 所有部门ID
     * @throws GeneralSimpleException 异常信息
     */
    List<String> getDataPermissionDepartmentOrgId() throws GeneralSimpleException;
    List<String> getDataPermissionDepartmentOrgId(String orgId) throws GeneralSimpleException;

    /**
     * 机构数，根据用户单位ID查询权限内的所有单位ID(包括参建单位)
     * @param orgId 单位ID
     * @return 单位ID
     */
    List<String> findTreePermissionOrgIdByUserOrgId(String orgId) throws GeneralSimpleException;

    /**
     * 根据用户权限查询机构树
     * @return 机构树
     */
    List<OrgInfoVO> getOrgTreeByPermission() throws GeneralSimpleException;
    List<OrgInfoVO> getDepartmentOrgTreeByPermission() throws GeneralSimpleException;

    /**
     * 根据组织机构ID查询所属项目部ID
     * @param orgId 组织机构ID
     * @return 所属项目部组织机构ID
     */
    String findDepartmentOrgIdByOrgId(String orgId);

    /**
     * 查询根节点机构信息
     * @param orgId 机构ID
     * @return 机构信息
     */
    OrgBean findRootNodeByOrgId(String orgId);
        
    /**
     * 校验用户单位信息
     * @param orgId 
     * @return
     */
    boolean checkOrg(String orgId);

   
    boolean checkDepartment() throws GeneralSimpleException;
    /**
     * 校验是否为部门
     * @param orgId 组织机构
     * @return 状态
     */
    boolean checkDepartmentByOrgId(String orgId);

    boolean checkParticipatingUnit() throws GeneralSimpleException;
    /**
     * 校验是否为参建单位
     * @param orgId 单位ID
     * @return 状态
     */
    boolean checkParticipatingUnitByOrgId(String orgId);

    /**
     * 根据用户信息查询项目部ID
     * @return 项目部ID
     */
    String getDepartmentOrgIdByUserId() throws GeneralSimpleException;

    String getDepartmentOrgIdByUserId(String userId) throws GeneralSimpleException;
    /**
     * 根据用户信息和所属项目部ID查询工程现场
     * @param departmentAdminOrgId 项目部ID
     * @param userId 用户ID
     * @return 施工现场ID
     */
    List<String> findWorkSiteByDepartmentAdminOrgIdAndSuperintendent(String departmentAdminOrgId, String userId) throws GeneralSimpleException;

    /**
     * 查询参建单位树
     * @return 参建单位
     */
    List<OrgInfoVO> getUnitTree() throws GeneralSimpleException;

    /**
     * 查询所有上级单位
     * @param projectDepartmentObjId 单位ID
     * @return 单位ID
     */
    List<String> findAllParentObjIdByOrgId(String projectDepartmentObjId);
}
